<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 纯函数：
    *   函数中的一种：有输入，有输出，中间不会修改全局任何状态，就是纯函数
    *
    * 结论：多写纯函数，这样对全局影响小
    *
    * */
    //纯函数 计算传入的数的平方
    function pingFang(n){
        return n * n
    }

    //不是纯函数的函数 对全局变量进行了修改
    let sum = 3
    function add(n){
        sum += n
    }

    /*
    * 偏函数：
    *   如果一个函数接收若干个参数，我们可以写成偏函数的形式，让函数分批次的接收多个参数
    *
    * */
    //function sum(a,b){
    //    return a + b
    //}
    //console.log(sum(2, 3))

    //function sum(a){
    //    return function (b){
    //        return a + b
    //    }
    //} //如果要对这个函数进行传值，可以这样写
    //sum(2)(3) //第一次传入值2，返回里面的函数，再给里面的函数传入值3，运行里面的函数

    let result = function(a){ //result函数
        return function(b){ //里面的函数
            return a + b
        }
    }

    setTimeout(function(){ //前一个函数
        let a = 3
        result = result(a) //如果a函数先执行，会返回里面的函数
    },Math.random()*1000+500)

    setTimeout(function(){ //后一个函数
        let b = 4
        result = result(b) //如果b函数先执行，会返回里面的函数
    },Math.random()*1000+500)
    //第一种情况：
    //如果前一个定时器函数先执行，那么它里面声明的变量值a=3，作为第一次传入的形参a，先传入result函数，成为形参a的值，返回里面的函数
    //后一个函数再执行，后一个函数里面声明的变量b=4，作为第二次传入的形参b，传入刚刚返回的 里面的函数，成为形参b的值，return a+b即3+4
    //第二种情况：
    //如果后一个定时器函数先执行，那么它里面声明的变量值b=4，作为第一次传入的形参a，先传入result函数，成为形参a的值，返回里面的函数
    //前一个函数再执行，前一个函数里面声明的变量a=3，作为第二次传入的形参b，传入刚刚返回的 里面的函数，成为形参b的值，return a+b即4+3
    //为什么用定时器写？因为我们在模拟异步函数情况，即后台分别返回两个不同的参数值，我们并不知道哪个参数先返回哪个参数后返回
    //也可以用点击事件写，两个不同的点击事件，分别返回两个不同的参数值，也能模拟异步的情况

    let ss = x => y => z => x + y + z //这个箭头函数，先接收一个参数x，再接收一个参数y，再接收一个参数z，最后返回这三个参数相加
    //如果用正常函数书写是以下情况
    let ss2 = function (x){
        return function (y){
            return function (z){
                return x + y + z
            }
        }
    }
    //如果接收的参数不确定个数
    let ss3 = (...x) => (...y) => (...z) => [...x,...y,...z].reduce((x,y)=>x+y)
    //以上偏函数都是既用到了偏函数的知识，也用到了闭包的知识，保存了上一个函数的变量参数，等待被执行


</script>
</body>
</html>